import { getAuthManager } from '../composables/useAuthManager'

/**
 * 全局未登录状态处理服务
 * 统一处理所有需要登录权限但用户未登录的情况
 * 替换所有"请先登录"的文字提示，统一使用登录弹窗
 */

export class AuthPromptService {
  private static instance: AuthPromptService
  private authModalStore: any = null

  private constructor() {}

  /**
   * 获取单例实例
   */
  static getInstance(): AuthPromptService {
    if (!AuthPromptService.instance) {
      AuthPromptService.instance = new AuthPromptService()
    }
    return AuthPromptService.instance
  }

  /**
   * 初始化服务，获取authModalStore实例
   */
  private async getAuthModalStore() {
    if (!this.authModalStore) {
      try {
        const { useAuthModalStore } = await import('../stores/authModal')
        this.authModalStore = useAuthModalStore()
      } catch (error) {
        console.error('AuthPromptService: 获取authModalStore失败', error)
      }
    }
    return this.authModalStore
  }

  /**
   * 显示登录弹窗
   * 替换所有"请先登录"的文字提示
   */
  async showLoginPrompt(): Promise<void> {
    console.log('AuthPromptService: 显示登录弹窗')
    const store = await this.getAuthModalStore()
    if (store) {
      store.showAuthModal()
    }
  }

  /**
   * 检查用户是否已登录，如果未登录则提示登录
   * @returns Promise<boolean> 是否已登录
   */
  async checkAndPromptLogin(): Promise<boolean> {
    try {
      // 使用 useAuthManager 的缓存机制
      const authManager = getAuthManager()
      const isAuthenticated = await authManager.checkAuthStatus()
      
      if (!isAuthenticated) {
        console.log('用户未登录，显示登录弹窗')
        await this.showLoginPrompt()
        return false
      }
      
      return true
    } catch (error) {
      console.error('AuthPromptService: 检查登录状态失败', error)
      // 只有在明确是认证错误时才显示登录弹窗
      if (error.message && error.message.includes('401')) {
        await this.showLoginPrompt()
      }
      return false
    }
  }

  /**
   * 包装需要登录的操作，如果用户未登录则显示登录弹窗
   * @param loginRequiredOperation 需要登录的操作函数
   * @returns 返回操作结果或null（如果用户未登录）
   */
  async withLoginPrompt<T>(loginRequiredOperation: () => Promise<T> | T): Promise<T | null> {
    const isLoggedIn = await this.checkAndPromptLogin()
    
    if (!isLoggedIn) {
      return null
    }
    
    try {
      return await loginRequiredOperation()
    } catch (error: any) {
      // 如果操作过程中出现认证错误，也显示登录弹窗
      if (
        error.response?.status === 401 ||
        (error.response?.data?.code === 401 || error.response?.data?.code === -1) && 
        error.response?.data?.msg && 
        (
          error.response.data.msg.includes('认证失败') || 
          error.response.data.msg.includes('Full authentication is required') ||
          error.response.data.msg.includes('未授权') ||
          error.response.data.msg.includes('Unauthorized') ||
          error.response.data.msg.includes('用户未登录')
        )
      ) {
        console.log('AuthPromptService: 操作过程中检测到认证错误，显示登录弹窗')
        await this.showLoginPrompt()
        return null
      }
      
      // 其他错误正常抛出
      throw error
    }
  }
}

// 创建单例实例
export const authPromptService = AuthPromptService.getInstance()

export default AuthPromptService